package controller

import (
	"Founction/Response"
	"Founction/global"
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"github.com/gin-gonic/gin"
	"strings"
)

func UploadFile(c *gin.Context) {
	// <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
	objectName := "ccui.mp4" //"<yourObjectName>"
	// <yourLocalFileName>由本地文件路径加文件名包括后缀组成，例如/users/local/myfile.txt。
	localFileName := "D:\\代码\\go\\gin框架\\Founction\\ccui.mp4" //"<yourLocalFileName>"

	cilent, err := oss.New(global.Oss.Endpoint, global.Oss.AccessKeyID, global.Oss.SecretAccessKey)
	if err != nil {
		fmt.Println("Error1:", err)
		global.Lg.Error(err.Error())
		return
	}
	// 获取存储空间。
	bucket, err := cilent.Bucket(global.Oss.BucketName)
	if err != nil {
		fmt.Println("Error2:", err)
		global.Lg.Error(err.Error())
		return
	}
	// 上传文件
	err = bucket.PutObjectFromFile(objectName, localFileName)
	if err != nil {
		fmt.Println("Error3:", err)
		global.Lg.Error(err.Error())
		return
	}
	Response.Success(c, 200, "上传文件成功", gin.H{
		"url":  global.Oss.BucketName + "/" + objectName,
		"name": objectName,
	})
}

func DownloadFile(c *gin.Context) {
	bucketName := global.Oss.BucketName
	// <yourObjectName>从OSS下载文件时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
	objectName := "ccui.png"
	// 分割字符串
	startName := strings.Split(objectName, ".")[len(strings.Split(objectName, "."))-2]
	endName := strings.Split(objectName, ".")[len(strings.Split(objectName, "."))-1]
	downloadedFileName := startName + "." + endName
	// 创建OSSClient实例。
	client, err := oss.New(global.Oss.Endpoint, global.Oss.AccessKeyID, global.Oss.SecretAccessKey)
	if err != nil {
		fmt.Println("Error:", err)
		global.Lg.Error(err.Error())
		return
	}
	// 获取存储空间。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		fmt.Println("Error:", err)
		global.Lg.Error(err.Error())
		return
	}
	// 下载文件。
	err = bucket.GetObjectToFile(objectName, downloadedFileName)
	if err != nil {
		fmt.Println("Error:", err)
		global.Lg.Error(err.Error())
		return
	}
	Response.Success(c, 200, "文件下载成功", gin.H{
		"url":  global.Oss.BucketName + "/" + objectName,
		"name": objectName,
	})
}

// GetAllFile 获取所有文件
func GetAllFile(c *gin.Context) {
	bucketName := global.Oss.BucketName
	// 创建OSSClient实例。
	client, err := oss.New(global.Oss.Endpoint, global.Oss.AccessKeyID, global.Oss.SecretAccessKey)
	if err != nil {
		fmt.Println("Error:", err)
		global.Lg.Error(err.Error())
		return
	}
	// 获取存储空间。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		fmt.Println("Error:", err)
		global.Lg.Error(err.Error())
		return
	}
	// 列举文件。
	marker := ""
	var Urls []string
	for {
		lsRes, err := bucket.ListObjects(oss.Marker(marker))
		if err != nil {
			fmt.Println("Error:", err)
			global.Lg.Error(err.Error())
			return
		}
		// 打印列举文件，默认情况下一次返回100条记录。
		for _, object := range lsRes.Objects {
			fmt.Println("Bucket: ", object.Key)
			publicURL := fmt.Sprintf("https://%s.%s/%s", global.Oss.BucketName, global.Oss.Endpoint, object.Key)
			fmt.Printf("The public URL of the object for preview is: %s\n", publicURL)
			if err != nil {
				fmt.Println("Error:", err)
				global.Lg.Error(err.Error())
				return
			}
			Urls = append(Urls, publicURL)
			Response.Success(c, 200, "获取文件成功", gin.H{
				"url":  publicURL,
				"name": object.Key,
			})
		}
		if lsRes.IsTruncated {
			marker = lsRes.NextMarker
		} else {
			break
		}
	}
}

// DeleteFile 删除文件
func DeleteFile(c *gin.Context) {
	objectName := "dd.png"
	client, err := oss.New(global.Oss.Endpoint, global.Oss.AccessKeyID, global.Oss.SecretAccessKey)
	if err != nil {
		fmt.Println("Error:", err)
		global.Lg.Error(err.Error())
		return
	}
	// 获取存储空间。
	bucket, err := client.Bucket(global.Oss.BucketName)
	if err != nil {
		fmt.Println("Error:", err)
		global.Lg.Error(err.Error())
		return
	}
	// 删除文件。
	err = bucket.DeleteObject(objectName)
	if err != nil {
		fmt.Println("Error:", err)
		global.Lg.Error(err.Error())
		return
	}
	Response.Success(c, 200, "删除文件成功", gin.H{
		"url":  global.Oss.BucketName + "/" + objectName,
		"name": objectName,
	})
}
